tool
extends EditorPlugin


func _enter_tree() -> void:
	# 连接场景树的 node_added 信号（节点被添加信号），连接到 _scene_node_added 方法
	get_tree().connect("node_added", self, "_scene_node_added")


func _exit_tree() -> void:
	# 插件关闭时断开信号连接
	if get_tree().is_connected("node_added", self, "_scene_node_added"):
		get_tree().disconnect("node_added", self, "_scene_node_added")


## (自定义方法) 编辑新添加的节点
func _edit_added_node(node: Node) -> void:
	pass


## 场景树节点的 node_added 信号连接调用的方法
var _yield_tree : bool = true
var _yield_node_list : Array = []
var _current_enabled : bool = true
func _scene_node_added(node: Node) -> void:
	# 如果新添加的节点中含有场景根节点
	# 则代表这次是切换了场景，则不进行添加
	if node == get_tree().edited_scene_root:
		_current_enabled = false
	
	_yield_node_list.push_back(node)
	
	# 这样做的原因是，选中节点时，属性检查器面板也会刷新添加节点
	# 这样会发出大量的信号调用这个方法
	# 所以要判断“哪个节点是新添加到场景中的节点”
	# 新添加的节点如果不等待一帧，则它的节点的 owner 属性是 null
	# 所以要 yield(get_tree(), "physics_frame") 等待一帧进行判断
	# 因为一帧调用一次这个节点就够了，防止多个节点都同时调用这个方法，
	# 所以就通过 _yield_tree 属性进行判断，
	# 这样就写成了如下代码的形式了
	if _yield_tree:
		_yield_tree = false
		yield(get_tree(), "physics_frame")
		_yield_tree = true
		
		if _current_enabled:
			for _node in _yield_node_list:
				# 判断节点的 owner (这个节点的场景根节点) 是否是当前场景的根节点
				if _node && _node.owner == get_tree().edited_scene_root:
					_edit_added_node(_node)
		
		_current_enabled = true
		_yield_node_list.clear()

